Hi,
This was originally posted here
In SAS Open Metadata reference (page 126), it says: The UpdateMetadata method enables you to update the properties of existing metadata objects. It returns an error if the metadata object to be updated does not exist, unless the OMI_IGNORE_NOTFOUND (134217728) flag is set.
Here is my problem, if I specify the flag or I don't specify the flag, I still get the same error: ("SASLibrary : A5X8AHW1.B40000SQ cannot be found in the wlibrary container in the Foundation repository.")
Here is a snippet that reproduces the error:
import com.sas.meta.SASOMI.IOMI; import com.sas.metadata.MetadataUtil; import org.omg.CORBA.StringHolder; IOMI iOMI = ... // an instance of IOMI connection StringHolder outputMeta = new StringHolder(); String request = "" + "<UpdateMetadata>" + " <Metadata>" + " <SASLibrary Id=\"A5X8AHW1.B40000SQ\"/>" + " </Metadata>" + " <NS>SAS</NS>" + " <Flags>" + (MetadataUtil.OMI_IGNORE_NOTFOUND | MetadataUtil.OMI_TRUSTED_CLIENT | MetadataUtil.OMI_RETURN_LIST) + "</Flags>" + " <Options/>" + "</UpdateMetadata>" ; iOMI.DoRequest(request, outputMeta);
Any ideas what is going wrong?
Regards,
Vasilij
OMI_IGNORE_NOTFOUND with the UpdateMetadata method only ignores objects notfound within the bounds of a remove function.
proc metadata
in='<UpdateMetadata>
<Metadata>
<Index Id="A5UL0H0J.BR000001" Name="foobaridx" Desc="A Index Description">
<Columns Function="Remove">
<Column Id="A5UL0H0J.BG0001ND" Name="Sex"/><!-- exists -->
<Column Id="A5UL0H0J.B0000001" Name="Foo"/><!-- not exists -->
</Columns>
</Index>
</Metadata>
<NS>SAS</NS>
<!-- OMI_TRUSTED_CLIENT -->
<Flags>268435456</Flags>
<Options/>
</UpdateMetadata>';
run;
ERROR: Subelement Column : A5UL0H0J.B0000001 cannot be removed from Index : A5UL0H0J.BR000001.
NOTE: PROCEDURE METADATA used (Total process time):
real time 0.07 seconds
cpu time 0.00 seconds
NOTE: The SAS System stopped processing this step because of errors.
proc metadata
in='<UpdateMetadata>
<Metadata>
<Index Id="A5UL0H0J.BR000001" Name="foobaridx" Desc="A Index Description">
<Columns Function="Remove">
<Column Id="A5UL0H0J.BG0001ND" Name="Sex"/><!-- exists -->
<Column Id="A5UL0H0J.B0000001" Name="Foo"/><!-- not exists -->
</Columns>
</Index>
</Metadata>
<NS>SAS</NS>
<!-- OMI_TRUSTED_CLIENT + OMI_IGNORE_NOTFOUND -->
<Flags>402653184</Flags>
<Options/>
</UpdateMetadata>';
run;
NOTE: Response XML:
<UpdateMetadata><Metadata><Index Id="A5UL0H0J.BR000001" Name="foobaridx" Desc="A Index Description"><Columns
Function="Remove"><Column Id="A5UL0H0J.BG0001NG" Name="Sex"/><Column Id="A5UL0H0J.B0000001"
Name="Foo"/></Columns></Index></Metadata><NS>SAS</NS><Flags>402653184</Flags><Options/></UpdateMetadata>
NOTE: PROCEDURE METADATA used (Total process time):
real time 0.04 seconds
cpu time 0.01 seconds
Hi,
does the metadata object "A5X8AHW1.B40000SQ" exist? You can use the following code to find out the
correct ID:
proc metadata
in='<GetMetadataObjects>
<Reposid>$METAREPOSITORY</Reposid>
<Type>SASLibrary</Type>
<Ns>SAS</Ns>
<Flags>1</Flags>
<Options/>
</GetMetadataObjects>';
run;
Thanks
Anja
Hello Anja,
Thank you for the comment. The object ID is correct. It existed, but was deleted. This is just a test code to validate why there is error about an object not found with the flag OMI_IGNORE_NOTFOUND present.
Regards,
Vasilij
OMI_IGNORE_NOTFOUND with the UpdateMetadata method only ignores objects notfound within the bounds of a remove function.
proc metadata
in='<UpdateMetadata>
<Metadata>
<Index Id="A5UL0H0J.BR000001" Name="foobaridx" Desc="A Index Description">
<Columns Function="Remove">
<Column Id="A5UL0H0J.BG0001ND" Name="Sex"/><!-- exists -->
<Column Id="A5UL0H0J.B0000001" Name="Foo"/><!-- not exists -->
</Columns>
</Index>
</Metadata>
<NS>SAS</NS>
<!-- OMI_TRUSTED_CLIENT -->
<Flags>268435456</Flags>
<Options/>
</UpdateMetadata>';
run;
ERROR: Subelement Column : A5UL0H0J.B0000001 cannot be removed from Index : A5UL0H0J.BR000001.
NOTE: PROCEDURE METADATA used (Total process time):
real time 0.07 seconds
cpu time 0.00 seconds
NOTE: The SAS System stopped processing this step because of errors.
proc metadata
in='<UpdateMetadata>
<Metadata>
<Index Id="A5UL0H0J.BR000001" Name="foobaridx" Desc="A Index Description">
<Columns Function="Remove">
<Column Id="A5UL0H0J.BG0001ND" Name="Sex"/><!-- exists -->
<Column Id="A5UL0H0J.B0000001" Name="Foo"/><!-- not exists -->
</Columns>
</Index>
</Metadata>
<NS>SAS</NS>
<!-- OMI_TRUSTED_CLIENT + OMI_IGNORE_NOTFOUND -->
<Flags>402653184</Flags>
<Options/>
</UpdateMetadata>';
run;
NOTE: Response XML:
<UpdateMetadata><Metadata><Index Id="A5UL0H0J.BR000001" Name="foobaridx" Desc="A Index Description"><Columns
Function="Remove"><Column Id="A5UL0H0J.BG0001NG" Name="Sex"/><Column Id="A5UL0H0J.B0000001"
Name="Foo"/></Columns></Index></Metadata><NS>SAS</NS><Flags>402653184</Flags><Options/></UpdateMetadata>
NOTE: PROCEDURE METADATA used (Total process time):
real time 0.04 seconds
cpu time 0.01 seconds
Since the OP was about the java version of the interface, and I don't get to use it much lately, here is a full example of a class to test the update vs delete metadata requests with OMI_IGNORE_NOTFOUND
import com.sas.metadata.remote.*;
import org.apache.log4j.Logger;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.rmi.RemoteException;
import java.util.Properties;
import static org.apache.log4j.Logger.*;
public class MdExample {
final static Logger logger = getLogger(MdExample.class);
private MdFactory _factory = null;
private String serverName = null;
private String serverPort = null;
private String serverUser = null;
private String serverPass = null;
private boolean serverLog = false;
public MdExample() {
getProperties();
initializeFactory();
}
private void getProperties() {
Properties prop = new Properties();
InputStream input = null;
try {
input = new FileInputStream("config.properties");
prop.load(input);
serverName = prop.getProperty("serverName", "localhost");
serverPort = prop.getProperty("serverPort", "8561");
serverUser = prop.getProperty("serverUser");
serverPass = prop.getProperty("serverPass");
serverLog = Boolean.parseBoolean(prop.getProperty("serverLog", "false"));
} catch (IOException e) {
e.printStackTrace();
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private void initializeFactory() {
try
{
_factory = new MdFactoryImpl(false);
boolean debug = false;
if (logger.isDebugEnabled()) {
debug = true;
}
_factory.setDebug(debug);
_factory.setLoggingEnabled(serverLog);
_factory.getUtil().setOutputStream(System.out);
_factory.getUtil().setLogStream(System.out);
} catch (Exception e)
{
e.printStackTrace();
}
}
public boolean connectToServer() {
try
{
MdOMRConnection connection = _factory.getConnection();
connection.makeOMRConnection(
serverName,
serverPort,
serverUser,
serverPass
);
} catch (MdException e) {
Throwable t = e.getCause();
if (t != null)
{
String ErrorType = e.getSASMessageSeverity();
String ErrorMsg = e.getSASMessage();
if (ErrorType != null)
{
System.out.println(ErrorType + ": " + ErrorMsg);
}
if (t instanceof org.omg.CORBA.COMM_FAILURE)
{
System.out.println(e.getLocalizedMessage());
}
}
else
{
System.out.println(e.getLocalizedMessage());
}
e.printStackTrace();;
return false;
} catch (RemoteException e) {
e.printStackTrace();
return false;
}
return true;
}
public String getFoundationRepository() {
try
{
MdOMIUtil omiUtil = _factory.getOMIUtil();
return omiUtil.getFoundationReposID();
} catch (MdException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
return null;
}
public boolean doesObjectExist(String reposID, String type, String xmlSelect) {
try
{
MdOMIUtil omiUtil = _factory.getOMIUtil();
int mdObjectCount = omiUtil.doesObjectExist(reposID,type,xmlSelect);
logger.debug("Sent to Metadata Server:\n"
+ "<GetMetadataObjects>\n"
+ " <ReposId>" + reposID + "</ReposId>\n"
+ " <Type>" + type + "</Type>\n"
+ " <Objects/>\n"
+ " <NS>SAS</NS>\n"
+ " <!-- OMI_XMLSELECT -->\n"
+ " <Flags>" + MdOMIUtil.OMI_XMLSELECT + "</Flags>\n"
+ " <Options>\n"
+ " " + xmlSelect + "\n"
+ " </Options>\n"
+ "</GetMetadataObjects>");
logger.debug("Response: " + mdObjectCount);
return mdObjectCount > 0;
} catch (MdException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
return false;
}
public void DoRequest(String xml) {
try
{
MdOMIUtil omiUtil = _factory.getOMIUtil();
omiUtil.DoRequestNoReturn(xml,true);
} catch (MdException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
MdExample util = new MdExample();
boolean connected = util.connectToServer();
if (connected) {
System.out.println("Connected...");
}
else
{
System.out.println("Error Connecting...");
return;
}
String foundationFQID = util.getFoundationRepository();
String id = foundationFQID.split("\\.")[1] + ".Z0000001";
boolean idExists = util.doesObjectExist(foundationFQID,"SASLibrary","<XMLSELECT search=\"SASLibrary[@Id='" + id + "']\"/>");
int flags = (MdOMIUtil.OMI_TRUSTED_CLIENT | MdOMIUtil.OMI_IGNORE_NOTFOUND);
String request = ""
+ "<UpdateMetadata>"
+ " <Metadata>"
+ " <SASLibrary Id='" + id + "' Name='Foobar'/>"
+ " </Metadata>"
+ " <NS>SAS</NS>"
+ " <Flags>" + flags + "</Flags>"
+ " <Options/>"
+ "</UpdateMetadata>"
;
System.out.println("UpdateMetadata will produce a GenericError Exception");
util.DoRequest(request);
System.out.println("DeleteMetadata will not produce a Exception");
util.DoRequest(request.replace("Update","Delete"));
}
}
Connected...
[main][DEBUG MdExample] - Sent to Metadata Server:
<GetMetadataObjects>
<ReposId>A0000001.A5UL0H0J</ReposId>
<Type>SASLibrary</Type>
<Objects/>
<NS>SAS</NS>
<!-- OMI_XMLSELECT -->
<Flags>128</Flags>
<Options>
<XMLSELECT search="SASLibrary[@Id='A5UL0H0J.Z0000001']"/>
</Options>
</GetMetadataObjects>
[main][DEBUG MdExample] - Response: 0
UpdateMetadata will produce a GenericError Exception
com.sas.iom.SASIOMDefs.GenericError: SASLibrary : A5UL0H0J.Z0000001 cannot be found in the wlibrary container in the REPOSMGR repository.
at com.sas.iom.SASIOMDefs.GenericErrorHelper.read(GenericErrorHelper.java:22)
at com.sas.iom.SASIOMDefs.GenericErrorHelper.extract(GenericErrorHelper.java:47)
at com.sas.meta.SASOMI._portable_stub_IOMI.DoRequest(_portable_stub_IOMI.java:581)
at com.sas.metadata.remote.MdOMIWrapperImpl.DoRequest(MdOMIWrapperImpl.java:742)
at com.sas.metadata.remote.MdOMIUtilImpl.DoRequestNoReturn(MdOMIUtilImpl.java:2639)
at MdExample.DoRequest(MdExample.java:157)
at MdExample.main(MdExample.java:198)
...
DeleteMetadata will not produce a Exception
Process finished with exit code 0
The SAS Users Group for Administrators (SUGA) is open to all SAS administrators and architects who install, update, manage or maintain a SAS deployment.
SAS technical trainer Erin Winters shows you how to explore assets, create new data discovery agents, schedule data discovery agents, and much more.
Find more tutorials on the SAS Users YouTube channel.