/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.jena.rdf.model.impl;

import org.apache.jena.enhanced.* ;
import org.apache.jena.graph.* ;
import org.apache.jena.rdf.model.* ;
import org.apache.jena.shared.* ;
import org.apache.jena.vocabulary.RDF ;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/** An implementation of Property.
 */

public class PropertyImpl extends ResourceImpl implements Property
    {

    @SuppressWarnings("hiding")
    final static public Implementation factory = new Implementation() 
        {
        @Override
        public boolean canWrap( Node n, EnhGraph eg )
            { return n.isURI(); }

        @Override
        public EnhNode wrap( Node n, EnhGraph eg )
            { return new PropertyImpl( n, eg ); }
    };

    protected static Logger logger = LoggerFactory.getLogger( PropertyImpl.class );

    protected int ordinal = -1;

    /** Creates new PropertyImpl */
    public PropertyImpl( String uri )
        {
        super( uri );
        checkLocalName();
        checkOrdinal();
        }

    @Override public Property inModel( Model m )
        { return getModel() == m ? this : m.createProperty( getURI() ); }

    private void checkLocalName()
        {
        String localName = getLocalName();
        if (localName == null || localName.equals( "" )) 
            throw new InvalidPropertyURIException( getURI() );
        }

    public PropertyImpl( String nameSpace, String localName )
        {
        super( nameSpace, localName );
        checkLocalName();
        checkOrdinal();
        }

    public PropertyImpl( String uri, ModelCom m )
        {
        super( uri, m );
        checkOrdinal();
        }

    public PropertyImpl( String nameSpace, String localName, ModelCom m )
        {
        super( nameSpace, localName, m );
        checkOrdinal();
        }

    public PropertyImpl( Node n, EnhGraph m )
        {
        super( n, m );
        checkOrdinal();
        }

    public PropertyImpl( String nameSpace, String localName, int ordinal, ModelCom m )
        {
        super( nameSpace, localName, m );
        checkLocalName();
        this.ordinal = ordinal;
        }

    @Override
    public boolean isProperty()
        { return true; }

    @Override
    public int getOrdinal()
        {
        if (ordinal < 0) ordinal = computeOrdinal();
        return ordinal;
        }

    private int computeOrdinal()
        {
        String localName = getLocalName();
        if (getNameSpace().equals( RDF.getURI() ) && localName.matches( "_[0-9]+" )) 
            return parseInt( localName.substring( 1 ) );
        return 0;
        }

    private int parseInt( String digits )
        {
        try { return Integer.parseInt( digits );}
        catch (NumberFormatException e) { throw new JenaException( "checkOrdinal fails on " + digits, e ); }
        }

    // Remove shortly.

    protected void checkOrdinal()
        {
        // char c;
        // String nameSpace = getNameSpace();
        // String localName = getLocalName();
        // // check for an rdf:_xxx property
        // if (localName.length() > 0)
        // {
        // if (localName.charAt(0) == '_' && nameSpace.equals(RDF.getURI())
        // && nameSpace.equals(RDF.getURI())
        // && localName.length() > 1
        // )
        // {
        // for (int i=1; i<localName.length(); i++) {
        // c = localName.charAt(i);
        // if (c < '0' || c > '9') return;
        // }
        //                try {
        //                  ordinal = Integer.parseInt(localName.substring(1));
        //                } catch (NumberFormatException e) {
        //                    logger.error( "checkOrdinal fails on " + localName, e );
        //                }
        //            }
        //        }
        }

    }

@@ -1768,58 +1768,8 @@
  );%0A
-        checkLocalName();%0A        checkOrdinal();%0A
     
@@ -1766,32 +1766,32 @@
 ri );%0A        %7D%0A
+
 %0A    @Override p
@@ -1903,227 +1903,8 @@
  %7D%0A%0A
-    private void checkLocalName()%0A        %7B%0A        String localName = getLocalName();%0A        if (localName == null %7C%7C localName.equals( %22%22 )) %0A            throw new InvalidPropertyURIException( getURI() );%0A        %7D%0A%0A
     
@@ -2014,58 +2014,8 @@
  );%0A
-        checkLocalName();%0A        checkOrdinal();%0A
     
@@ -2110,32 +2110,8 @@
  );%0A
-        checkOrdinal();%0A
     
@@ -2247,32 +2247,8 @@
  );%0A
-        checkOrdinal();%0A
     
@@ -2337,32 +2337,8 @@
  );%0A
-        checkOrdinal();%0A
     
@@ -2487,66 +2487,8 @@
  );%0A
-        checkLocalName();%0A        this.ordinal = ordinal;%0A
     
@@ -2643,16 +2643,29 @@
 al %3C 0) 
+%0A            
 ordinal 
@@ -3184,24 +3184,24 @@
 its, e ); %7D%0A
+
         %7D%0A%0A 
@@ -3202,959 +3202,8 @@
   %7D%0A
-%0A    // Remove shortly.%0A%0A    protected void checkOrdinal()%0A        %7B%0A        // char c;%0A        // String nameSpace = getNameSpace();%0A        // String localName = getLocalName();%0A        // // check for an rdf:_xxx property%0A        // if (localName.length() %3E 0)%0A        // %7B%0A        // if (localName.charAt(0) == '_' && nameSpace.equals(RDF.getURI())%0A        // && nameSpace.equals(RDF.getURI())%0A        // && localName.length() %3E 1%0A        // )%0A        // %7B%0A        // for (int i=1; i%3ClocalName.length(); i++) %7B%0A        // c = localName.charAt(i);%0A        // if (c %3C '0' %7C%7C c %3E '9') return;%0A        // %7D%0A        //                try %7B%0A        //                  ordinal = Integer.parseInt(localName.substring(1));%0A        //                %7D catch (NumberFormatException e) %7B%0A        //                    logger.error( %22checkOrdinal fails on %22 + localName, e );%0A        //                %7D%0A        //            %7D%0A        //        %7D%0A        %7D%0A%0A
     

Merge commit 'refs/pull/186/head' of github.com:apache/jena